// 从事件对象中解析得到 componentId
// 需要在元素上声明 data-component-id
export const getComponentByTag = (parent, tag) => {
  for (let c of parent.$children) {
    if (c.$options._componentTag === tag) {
      return c
    }
  }
}

export const extractComponentId = (event = {}) => {
  const { dataset: { componentId } } = event.currentTarget || {}
  return componentId
}

/*
  注：默认合并所有生命周期函数
  配置合并指定的生命周期 or 忽略指定字段
  const extend = extendCreator({
    life: ['onLoad', 'onPullDownRefresh'],
    exclude: ['binder']
  });

  Page(extend({}, {
    onLoad() {},
    ...
  }));
*/

const LIFE_CYCLE = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage', 'onPageScroll']

const extendCreator = (config = {}) => {
  const {
    life = LIFE_CYCLE,
    exclude = []
  } = config

  const excludeList = exclude.concat(LIFE_CYCLE.map(getFuncArrayName))

  if (!Array.isArray(life) || !Array.isArray(exclude)) throw new Error('Invalid Extend Config')
  let lifeCycleList = life.filter(item => LIFE_CYCLE.indexOf(item) >= 0)
  return function extend (target, ...objList) {
    objList.forEach((source) => {
      if (source) {
        let keys = Object.keys(source)
        keys.forEach((key) => {
          let value = source[key]
          if (excludeList.indexOf(key) >= 0) return
          if (lifeCycleList.indexOf(key) >= 0 && typeof value === 'function') {
            let funcArrayName = getFuncArrayName(key)
            if (!target[funcArrayName]) {
              target[funcArrayName] = []
              if (target[key]) {
                target[funcArrayName].push(target[key])
              }
              target[key] = function (...rest) {
                target[funcArrayName].forEach(func => func.apply(this, rest))
              }
            }

            if (source[funcArrayName]) {
              // 经过生命周期合并的组件直接整合函数列表
              target[funcArrayName].push(...source[funcArrayName])
            } else {
              // 添加生命周期函数进入函数列表
              target[funcArrayName].push(value)
            }
          } else {
            target[key] = value
          }
        })
      }
    })
    return target
  }
}

const getFuncArrayName = name => `__$${name}`

export default {
  extractComponentId,
  extend: Object.assign,
  extendCreator
}
